#include <iostream>
using namespace std;

const int N = 50010, around = 3; //N=50010是因为题中N最大都是50000，around=3是因为有三个物种相互吃
int p[N], rela[N];               //q用来存储并查集的各个元素的上一位是啥子，d用来存储和上一位的关系，0同类，1吃，2被吃
int n, k, d, x, y, mis;          //对应题中的N,K,D,X,Y;ans表示答案

int find(int x)
{
    if (p[x] != x)
    {
        int u = find(p[x]);
        rela[x] += rela[p[x]];
        p[x] = u;
    }
    rela[x] %= 3;
    return p[x];
}

int main()
{
    cin >> n >> k;
    mis = 0;
    for (int i = 1; i <= n; ++i)
        p[i] = i; //对并查集进行初始化，d默认是0，所以这里不做操作
    while (k--)
    {
        cin >> d >> x >> y;
        if (x > n || y > n)
            mis++; //考虑第二种情况
        else
        {
            int px = find(x);
            int py = find(y);
            if (px != py)
            {
                p[px] = py;
                rela[px] = (3 - rela[x] + d - 1 + rela[y]) % around;
            } //为还没说过的真话，加进去
            else
            {
                if (d - 1 != (rela[x] + 3 - rela[y]) % around)
                    ++mis;
            } //第一种和第三种情况
        }
    }
    cout << mis;
    return 0;
}
